﻿//
// ParallelGrep
//
// Copyright (C) 2011 - Tatsuya Niioka
//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ICSharpCode.AvalonEdit;
using ICSharpCode.AvalonEdit.Rendering;
using System.Windows;

namespace ParallelGrep.View
{
    /// <summary>
    /// テキストエディタクラス
    /// </summary>
    public class TextEditor : ICSharpCode.AvalonEdit.TextEditor
    {
        #region Constrcutor
        /// <summary>
        /// 新しい<see cref="TextEditor"/>クラスを生成します。
        /// </summary>
        public TextEditor()
        {
        }
        #endregion

        #region ColumnIndexProperty
        /// <summary>
        /// カラム位置プロパティ
        /// </summary>
        public static readonly DependencyProperty ColumnIndexProperty =
            DependencyProperty.Register("ColumnIndex", typeof(int), typeof(TextEditor),
                            new FrameworkPropertyMetadata(new PropertyChangedCallback(OnColumnIndexPropertyChanged)));
        #endregion

        #region ColumnIndex
        /// <summary>
        /// カラム位置を取得または設定します。
        /// </summary>
        public int ColumnIndex
        {
            get
            {
                return (int)this.GetValue(ColumnIndexProperty);
            }
            set
            {
                this.SetValue(ColumnIndexProperty, value);
            }
        }
        #endregion

        #region LineNumberProperty
        /// <summary>
        /// 行番号プロパティ
        /// </summary>
        public static readonly DependencyProperty LineNumberProperty =
                    DependencyProperty.Register("LineNumber", typeof(int), typeof(TextEditor),
                                    new FrameworkPropertyMetadata(new PropertyChangedCallback(OnLineNumberPropertyChanged)));
        #endregion

        #region LineNumber
        /// <summary>
        /// 行番号を取得または設定します。
        /// </summary>
        public int LineNumber
        {
            get
            {
                return (int)this.GetValue(LineNumberProperty);
            }
            set
            {
                this.SetValue(LineNumberProperty, value);
            }
        }
        #endregion

        #region VisualLineTransformerProperty
        /// <summary>
        /// ヴィジュアルライントランスフォーマープロパティ
        /// </summary>
        public static readonly DependencyProperty VisualLineTransformerProperty =
                DependencyProperty.Register("VisualLineTransformer", typeof(IVisualLineTransformer), typeof(TextEditor),
                           new FrameworkPropertyMetadata(new PropertyChangedCallback(OnVisualLineTransformerPropertyChanged)));
        #endregion

        #region VisualLineTransformer
        /// <summary>
        /// ビジュアルライントランスフォーマーを取得または設定します。
        /// </summary>
        public IVisualLineTransformer VisualLineTransformer
        {
            get
            {
                return (IVisualLineTransformer)this.GetValue(VisualLineTransformerProperty);
            }
            set
            {
                this.SetValue(VisualLineTransformerProperty, value);
            }
        }
        #endregion

        #region OnColumnIndexPropertyChanged
        /// <summary>
        /// カラム位置を変更したイベント処理を実行します。
        /// </summary>
        /// <param name="dependencyObject">依存関係プロパティ システムに関連するオブジェクト</param>
        /// <param name="e">イベントデータ</param>
        private static void OnColumnIndexPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
        {
            TextEditor textEditor = dependencyObject as TextEditor;
            int lineNumber = (int)dependencyObject.GetValue(LineNumberProperty);
            int columnIndex = (int)dependencyObject.GetValue(ColumnIndexProperty);
            textEditor.ScrollTo(lineNumber, columnIndex);
        }
        #endregion

        #region OnLineNumberPropertyChanged
        /// <summary>
        /// 行番号を変更したイベント処理を実行します。
        /// </summary>
        /// <param name="dependencyObject">依存関係プロパティ システムに関連するオブジェクト</param>
        /// <param name="e">イベントデータ</param>
        private static void OnLineNumberPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
        {
            TextEditor textEditor = dependencyObject as TextEditor;
            int lineNumber = (int)dependencyObject.GetValue(LineNumberProperty);
            int columnIndex = (int)dependencyObject.GetValue(ColumnIndexProperty);
            textEditor.ScrollTo(lineNumber, columnIndex);
        }
        #endregion

        #region OnVisualLineTransformerPropertyChanged
        /// <summary>
        /// ヴィジュアルライントランスフォーマーを変更したイベント処理を実行します。
        /// </summary>
        /// <param name="dependencyObject">依存関係プロパティ システムに関連するオブジェクト</param>
        /// <param name="e">イベントデータ</param>
        private static void OnVisualLineTransformerPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
        {
            TextEditor textEditor = dependencyObject as TextEditor;
            IVisualLineTransformer transformer = (IVisualLineTransformer)dependencyObject.GetValue(VisualLineTransformerProperty);
            if (transformer != null)
            {
                for (int idx = 0; idx < textEditor.TextArea.TextView.LineTransformers.Count; idx++)
                {
                    if (textEditor.TextArea.TextView.LineTransformers[idx] is ParallelGrep.ViewModel.RegexDocumentColorizingTransformer)
                    {
                        textEditor.TextArea.TextView.LineTransformers.RemoveAt(idx);
                        break;
                    }
                }
                textEditor.TextArea.TextView.LineTransformers.Insert(0, transformer);
            }
        }
        #endregion
    }
}
